﻿using System;
using System.ComponentModel;
using System.Windows.Forms;
using GSQ.BusinessEntities;
using GSQ.BusinessLogic;

namespace UIapp.Dialogos
{
    public partial class frmClientes : Plantillas.frmDialogPlantilla, Interfaces.IPantalla
    {
        public frmClientes(CLIENTES entity)
        {
            InitializeComponent();

            try
            {
                if (entity == null)
                {
                    this.newEntity = new CLIENTES();
                    this.oldEntity = null;
                }
                else
                {
                    this.oldEntity = entity;
                    this.newEntity = new ClientesBL().GetById(entity.ID);
                    this.radGridView1.DataSource = new FacturasBL().GetByFacturasPendientesPagos(this.newEntity.ID);
                }
                this.BindControls();
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        #region Variables
        public CLIENTES oldEntity;
        public CLIENTES newEntity;
        bool entityError = false;
        #endregion

        #region Metodos auxiliares
        public void BindControls()
        {
            this.txtId.DataBindings.Add("Text", this.newEntity, "ID");
            this.txtCliente.DataBindings.Add("Text", this.newEntity, "CLIENTE");
            this.txtRnc.DataBindings.Add("Text", this.newEntity, "RNC");
            this.txtNombreComercial.DataBindings.Add("Text", this.newEntity, "NOMBRE_COMERCIAL");
            this.txtDireccion.DataBindings.Add("Text", this.newEntity, "DIRECCION");
            if (this.newEntity.CIUDADES != null)
            {
                this.txtIdCiudad.Text = this.newEntity.ID_CIUDAD.ToString();
                this.txtCiudad.Text = this.newEntity.CIUDADES.CIUDAD;
            }
            this.txtTel1.DataBindings.Add("Text", this.newEntity, "TELEFONO");
            this.txtTel2.DataBindings.Add("Text", this.newEntity, "CELULAR");
            this.txtFax.DataBindings.Add("Text", this.newEntity, "FAX");
            this.txtOtro.DataBindings.Add("Text", this.newEntity, "OTRO");
            this.txtEmail.DataBindings.Add("Text", this.newEntity, "EMAIL");
            if (this.newEntity.ZONAS != null)
            {
                this.txtIdZona.Text = this.newEntity.ID_ZONA.ToString();
                this.txtZona.Text = this.newEntity.ZONAS.ZONA;
            }
            if (this.newEntity.RUTAS != null)
            {
                this.txtIdRuta.Text = this.newEntity.ID_RUTA.ToString();
                this.txtRuta.Text = this.newEntity.RUTAS.RUTA;
            }
            this.chkActivo.DataBindings.Add("Checked", this.newEntity, "ACTIVO");
            if (this.newEntity.FORMAS_PAGOS != null)
            {
                this.txtIdFormaPago.Text = this.newEntity.ID_FORMA_PAGO.ToString();
                this.txtFormaPago.Text = this.newEntity.FORMAS_PAGOS.FORMA_PAGO;
            }
            if (this.newEntity.CLIENTES_CAT != null)
            {
                this.txtIdCategoria.Text = this.newEntity.ID_CATEGORIA.ToString();
                this.txtCategoria.Text = this.newEntity.CLIENTES_CAT.CATEGORIA;
            }
            if (this.newEntity.VENDEDORES != null)
            {
                this.txtIdVendedor.Text = this.newEntity.ID_VENDEDOR.ToString();
                this.txtVendedor.Text = this.newEntity.VENDEDORES.VENDEDOR;
            }
            Binding s = new Binding("Text", this.newEntity, "LIMITE_CREDITO", true, DataSourceUpdateMode.OnValidation, null, "N2");
            s.DataSourceNullValue = 1;
            this.txtLimiteCredito.DataBindings.Add(s);

            this.chkImpuestos.DataBindings.Add("Checked", this.newEntity, "IMPUESTOS");
            this.txtObservaciones.DataBindings.Add("Text", this.newEntity, "OBSERVACIONES");
            this.lblMontoAdeudado.Text = this.newEntity.MONTO_ADEUDADO.ToString("N2");
        }

        private void Guardar()
        {
            if (newEntity.IsValid())
            {
                if (this.oldEntity == null)
                {
                    this.newEntity.ACTIVO = true;
                    new ClientesBL().Insert(this.newEntity);
                }
                else
                {
                    new ClientesBL().Update(this.newEntity, this.oldEntity);
                    this.oldEntity = this.newEntity;
                }
                this.entityError = false;
            }
            else
            {
                this.entityError = true;
                Comun.ShowMessage(newEntity);
            }
        }

        private bool BuscarCiudad()
        {
            decimal id = 0;
            CIUDADES ciudad;
            if (decimal.TryParse(this.txtIdCiudad.Text.Trim(), out id))
            {
                if (this.newEntity.ID_CIUDAD == 0 || this.newEntity.ID_CIUDAD != id)
                {
                    ciudad = new CiudadesBL().GetById(id);
                    if (ciudad != null && ciudad.ACTIVO)
                    {
                        this.newEntity.ID_CIUDAD = ciudad.ID;
                        this.txtCiudad.Text = ciudad.CIUDAD;
                        this.newEntity.CIUDADES = ciudad;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_CIUDAD = 0;
                        this.newEntity.CIUDADES = null;
                        this.txtCiudad.Clear();
                        this.txtIdCiudad.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_CIUDAD = 0;
            this.newEntity.CIUDADES = null;
            this.txtCiudad.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }

        private bool BuscarZona()
        {
            decimal id = 0;
            ZONAS zona;
            if (decimal.TryParse(this.txtIdZona.Text.Trim(), out id))
            {
                if (this.newEntity.ID_ZONA == null || this.newEntity.ID_ZONA != id)
                {
                    zona = new ZonasBL().GetById(id);
                    if (zona != null)
                    {
                        this.newEntity.ID_ZONA = zona.ID;
                        this.txtZona.Text = zona.ZONA;
                        this.newEntity.ZONAS = zona;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_ZONA = null;
                        this.newEntity.ZONAS = null;
                        this.txtZona.Clear();
                        this.txtIdZona.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_ZONA = null;
            this.newEntity.ZONAS = null;
            this.txtZona.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }

        private bool BuscarRuta()
        {
            decimal id = 0;
            RUTAS ruta;
            if (decimal.TryParse(this.txtIdRuta.Text.Trim(), out id))
            {
                if (this.newEntity.ID_RUTA == null || this.newEntity.ID_RUTA != id)
                {
                    ruta = new RutasBL().GetById(id);
                    if (ruta != null)
                    {
                        this.newEntity.ID_RUTA = ruta.ID;
                        this.txtRuta.Text = ruta.RUTA;
                        this.newEntity.RUTAS = ruta;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_RUTA = null;
                        this.newEntity.RUTAS = null;
                        this.txtRuta.Clear();
                        this.txtIdRuta.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_RUTA = null;
            this.newEntity.RUTAS = null;
            this.txtRuta.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }

        private bool BuscarCategoria()
        {
            decimal id = 0;
            CLIENTES_CAT categoria;
            if (decimal.TryParse(this.txtIdCategoria.Text.Trim(), out id))
            {
                if (this.newEntity.ID_CATEGORIA == 0 || this.newEntity.ID_CATEGORIA != id)
                {
                    categoria = new ClientesBL().GetCategoriasById(id);
                    if (categoria != null)
                    {
                        this.newEntity.ID_CATEGORIA = categoria.ID;
                        this.txtCategoria.Text = categoria.CATEGORIA;
                        this.newEntity.CLIENTES_CAT = categoria;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_CATEGORIA = 0;
                        this.newEntity.CLIENTES_CAT = null;
                        this.txtCategoria.Clear();
                        this.txtIdCategoria.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_CATEGORIA = 0;
            this.newEntity.CLIENTES_CAT = null;
            this.txtCategoria.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }

        private CLIENTES BuscarRNC(string value)
        {
            return new ClientesBL().GetByRnc(value);
        }

        private bool BuscarFormaPago()
        {
            decimal id = 0;
            FORMAS_PAGOS forma_pago;
            if (decimal.TryParse(this.txtIdFormaPago.Text.Trim(), out id))
            {
                if (this.newEntity.ID_FORMA_PAGO == 0 || this.newEntity.ID_FORMA_PAGO != id)
                {
                    forma_pago = new FormasPagosBL().GetById(id);
                    if (forma_pago != null)
                    {
                        this.newEntity.ID_FORMA_PAGO = forma_pago.ID;
                        this.txtFormaPago.Text = forma_pago.FORMA_PAGO;
                        this.newEntity.FORMAS_PAGOS = forma_pago;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_FORMA_PAGO = 0;
                        this.newEntity.FORMAS_PAGOS = null;
                        this.txtFormaPago.Clear();
                        this.txtIdFormaPago.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_FORMA_PAGO = 0;
            this.newEntity.FORMAS_PAGOS = null;
            this.txtFormaPago.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }

        private bool BuscarVendedor()
        {
            decimal id = 0;
            VENDEDORES vendedor;
            if (decimal.TryParse(this.txtIdVendedor.Text.Trim(), out id))
            {
                if (this.newEntity.ID_VENDEDOR == 0 || this.newEntity.ID_VENDEDOR != id)
                {
                    vendedor = new VendedoresBL().GetById(id);
                    if (vendedor != null)
                    {
                        this.newEntity.ID_VENDEDOR = vendedor.ID;
                        this.txtVendedor.Text = vendedor.VENDEDOR;
                        this.newEntity.VENDEDORES = vendedor;
                        return true;
                    }
                    else
                    {
                        Comun.ShowInMainMessage("No existen datos con este código");
                        this.newEntity.ID_VENDEDOR = 0;
                        this.newEntity.VENDEDORES = null;
                        this.txtVendedor.Clear();
                        this.txtIdVendedor.Focus();
                        return false;
                    }
                }
                return true;
            }
            this.newEntity.ID_FORMA_PAGO = 0;
            this.newEntity.VENDEDORES = null;
            this.txtVendedor.Clear();
            Comun.ShowInMainMessage("Solo números son permitidos en este campo");
            return false;
        }
        #endregion

        #region Tratamiento de eventos

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                this.backgroundWorker.RunWorkerAsync();
                Comun.ShowLoadingFRM();
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Guardar();
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Comun.CloseLoadingFRM();
            if (e.Error != null)
                Comun.ShowMessage(e.Error);
            else if (this.entityError)
                return;
            else
            {
                Comun.ShowInMainMessage("Datos guardados correctamente...");
                this.DialogResult = System.Windows.Forms.DialogResult.OK;
                this.Close();
            }
        }

        private void txtIdCiudad_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdCiudad.Text.Length > 0)
                {
                    if (!this.BuscarCiudad())
                    {
                        this.txtCiudad.Clear();
                        this.txtIdCiudad.Focus();
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.newEntity.ID_CIUDAD = 0;
                    this.txtCiudad.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtIdCiudad_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmCatalogos frm = new Busquedas.frmCatalogos(Comun.Catalogos.Ciudades);
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.CIUDADES = null;
                    this.newEntity.ID_CIUDAD = ((CIUDADES)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdCiudad.Text = ((CIUDADES)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtCiudad.Text = ((CIUDADES)frm.radGridView.CurrentRow.DataBoundItem).CIUDAD;
                }
            }
        }

        private void txtEmail_Validating(object sender, CancelEventArgs e)
        {
            if (this.txtEmail.Text.Trim() != string.Empty)
            {
                if (!Comun.ValidarEmail(this.txtEmail.Text.Trim()))
                {
                    Comun.ShowInMainMessage("Formaro e-mail no valido. (Ej. algo@servidor.com)");
                    this.txtEmail.Focus();
                    e.Cancel = true;
                }
            }
        }

        private void txtRnc_Validating(object sender, CancelEventArgs e)
        {
            if (this.txtRnc.Text.Trim() != string.Empty)
            {
                if (this.txtRnc.Text.Trim() == "0")
                {
                    this.txtRnc.Text = this.txtRnc.Text.Trim();
                    return;
                }

                if (this.txtRnc.Text.Trim().Length == 9)
                {
                    if (!Comun.ValidaRNC(this.txtRnc.Text.Trim()))
                    {
                        Comun.ShowInMainMessage("RNC no valido.");
                        this.txtRnc.Focus();
                        e.Cancel = true;
                        return;
                    }
                }
                else if (this.txtRnc.Text.Trim().Length == 11)
                {
                    if (!Comun.ValidaCedula(this.txtRnc.Text.Trim()))
                    {
                        Comun.ShowInMainMessage("CEDULA no valida.");
                        this.txtRnc.Focus();
                        e.Cancel = true;
                        return;
                    }
                }

                else
                {
                    Comun.ShowInMainMessage("No valido se requieren 9 ó 11 caracteres numericos");
                    this.txtRnc.Focus();
                    e.Cancel = true;
                    return;
                }

                if (this.oldEntity != null && this.newEntity.RNC != this.txtRnc.Text.Trim() && this.BuscarRNC(this.txtRnc.Text.Trim()) != null)
                {
                    Comun.ShowInMainMessage("RNC o CEDULA registrado previamente.");
                    this.txtRnc.Focus();
                    return;
                }
                else if (this.oldEntity == null && this.BuscarRNC(this.txtRnc.Text.Trim()) != null)
                {
                    Comun.ShowInMainMessage("RNC o CEDULA registrado previamente.");
                    this.txtRnc.Focus();
                    return;
                }
            }
        }

        private void txtIdZona_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmZonas frm = new Busquedas.frmZonas();
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.ZONAS = null;
                    this.newEntity.ID_ZONA = ((ZONAS)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdZona.Text = ((ZONAS)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtZona.Text = ((ZONAS)frm.radGridView.CurrentRow.DataBoundItem).ZONA;
                }
            }
        }

        private void txtIdZona_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdZona.Text.Length > 0)
                {
                    if (!this.BuscarZona())
                    {
                        this.txtZona.Clear();
                        this.txtIdZona.Focus();
                    }
                }
                else
                {
                    this.newEntity.ID_ZONA = null;
                    this.txtZona.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtIdRuta_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmRutas frm = new Busquedas.frmRutas();
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.RUTAS = null;
                    this.newEntity.ID_RUTA = ((RUTAS)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdRuta.Text = ((RUTAS)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtRuta.Text = ((RUTAS)frm.radGridView.CurrentRow.DataBoundItem).RUTA;
                }
            }
        }

        private void txtIdRuta_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdRuta.Text.Length > 0)
                {
                    if (!this.BuscarRuta())
                    {
                        this.txtRuta.Clear();
                        this.txtIdRuta.Focus();
                    }
                }
                else
                {
                    this.newEntity.ID_RUTA = null;
                    this.txtRuta.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtIdCategoria_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdCategoria.Text.Length > 0)
                {
                    if (!this.BuscarCategoria())
                    {
                        this.txtCategoria.Clear();
                        this.txtIdCategoria.Focus();
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.newEntity.ID_CATEGORIA = 0;
                    this.txtCategoria.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtIdCategoria_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmClientesCategorias frm = new Busquedas.frmClientesCategorias();
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.CLIENTES_CAT = null;
                    this.newEntity.ID_CATEGORIA = ((CLIENTES_CAT)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdCategoria.Text = ((CLIENTES_CAT)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtCategoria.Text = ((CLIENTES_CAT)frm.radGridView.CurrentRow.DataBoundItem).CATEGORIA;
                }
            }
        }

        private void txtIdFormaPago_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdFormaPago.Text.Length > 0)
                {
                    if (!this.BuscarFormaPago())
                    {
                        this.txtFormaPago.Clear();
                        this.txtIdFormaPago.Focus();
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.newEntity.ID_FORMA_PAGO = 0;
                    this.txtFormaPago.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtIdFormaPago_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmFormasPagos frm = new Busquedas.frmFormasPagos();
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.FORMAS_PAGOS = null;
                    this.newEntity.ID_FORMA_PAGO = ((FORMAS_PAGOS)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdFormaPago.Text = ((FORMAS_PAGOS)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtFormaPago.Text = ((FORMAS_PAGOS)frm.radGridView.CurrentRow.DataBoundItem).FORMA_PAGO;
                }
            }
        }

        private void txtIdVendedor_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.F9)
            {
                Busquedas.frmVendedores frm = new Busquedas.frmVendedores();
                frm.ShowDialog();
                if (frm.DialogResult == System.Windows.Forms.DialogResult.OK)
                {
                    this.newEntity.VENDEDORES = null;
                    this.newEntity.ID_VENDEDOR = ((VENDEDORES)frm.radGridView.CurrentRow.DataBoundItem).ID;
                    this.txtIdVendedor.Text = ((VENDEDORES)frm.radGridView.CurrentRow.DataBoundItem).ID.ToString();
                    this.txtVendedor.Text = ((VENDEDORES)frm.radGridView.CurrentRow.DataBoundItem).VENDEDOR;
                }
            }
        }

        private void txtIdVendedor_Validating(object sender, CancelEventArgs e)
        {
            try
            {
                if (this.txtIdVendedor.Text.Length > 0)
                {
                    if (!this.BuscarVendedor())
                    {
                        this.txtVendedor.Clear();
                        this.txtIdVendedor.Focus();
                        e.Cancel = true;
                    }
                }
                else
                {
                    this.newEntity.ID_VENDEDOR = 0;
                    this.txtVendedor.Clear();
                }
            }
            catch (Exception ex)
            {
                Comun.ShowMessage(ex);
            }
        }

        private void txtCliente_Validated(object sender, EventArgs e)
        {
            if (this.txtCliente.Text.Length > 0 && this.txtNombreComercial.Text.Length == 0)
            {
                this.newEntity.NOMBRE_COMERCIAL = newEntity.CLIENTE;
            }
        }
        #endregion

        #region Implementacion IPantalla
        public int ComandosSoportados
        {
            get { return 0; }
        }

        public void Nuevo()
        {
            throw new NotImplementedException();
        }

        public void Modificar()
        {
            throw new NotImplementedException();
        }

        public void Eliminar()
        {
            throw new NotImplementedException();
        }

        public void Refrescar()
        {
            throw new NotImplementedException();
        }

        public void Buscar()
        {
            throw new NotImplementedException();
        }

        public void AgregarProducto(Controles.TransferEntity tranferEntity)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
}
